This is some in-development work, based on something you’ve previously seen.

Below you’ll see the following:

* Rent burdened is defined as >35% of income is spent on rent

You can zoom in on the map (underlied by imagery), and clicking on community districts will highlight them both in the map and the scatterplot, and keep them in the table while excluding other rows. (The community district # will also be displayed). To reset the selection, you can either re-click the individual polygons, or just double click in the scatterplot. You can also draw a box around points in the scatterplot, which will highlight them in the map, and keep them in the table. (Unfortunately at this point, the table is really just for viewing - you can order data by clicking on column names, but you can’t select data in the table and have it reflected in the scatterplot/map.)

This is really for exploratory visualizations, and there are naturally additional things that can be added for ease of use. Compared to a previous version, this lets you select polygons, and also view the data in the table. In the near future I’ll work to do this with other layers, for example looking at combined % area canopy+grass by community district, and some other socio-economic variables from the Community Profiles. I’ll also work to add functionality to toggle layers on/off, and change the variable names as displayed. [running tally of desired functionality is at the bottom of the page.]



Desired Functionality:

LS0tCnRpdGxlOiAiUGN0IENhbm9weSB2cy4gUGN0IG9mIEhvdXNlaG9sZHMgUmVudCBCdXJkZW5lZCIKb3V0cHV0OiBodG1sX25vdGVib29rCmRhdGU6IDExIEZlYiAyMDE4CmF1dGhvcjogTWlrZSBUcmVnbGlhCi0tLQoKVGhpcyBpcyBzb21lIGluLWRldmVsb3BtZW50IHdvcmssIGJhc2VkIG9uIHNvbWV0aGluZyB5b3UndmUgcHJldmlvdXNseSBzZWVuLgoKQmVsb3cgeW91J2xsIHNlZSB0aGUgZm9sbG93aW5nOgoKKiBBIG1hcCBzaGFkZWQgYnkgJSBDYW5vcHkgQ292ZXIgYnkgTllDIENvbW11bml0eSBEaXN0cmljdCBbIkNhbl9QIiwgQmFzZWQgb24gMjAxMCBkYXRhOyBEYXJrZXIgR3JlZW4gPSBNb3JlIENhbm9weV0uIFRoZSBiYXNlbWFwIGlzIDIwMTYgTllDIEltYWdlcnk7CiogQSBzY2F0dGVycGxvdCBzaG93aW5nIHRoZSAlIG9mIGhvdXNlaG9sZHMgdGhhdCBhcmUgcmVudCBidXJkZW5lZCBvbiAgdGhlIHktYXhpcyBbQmFzZWQgb24gW05ZQyBDb21tdW5pdHkgUHJvZmlsZXNdKGh0dHBzOi8vY29tbXVuaXR5cHJvZmlsZXMucGxhbm5pbmcubnljLmdvdi8pXSwgd2l0aCAlIENhbm9weSBDb3ZlciBvbiB0aGUgeC1heGlzOyBhbmQgCiogQSB0YWJsZSBvZiB0aGUgZGF0YS4KClwqICpSZW50IGJ1cmRlbmVkIGlzIGRlZmluZWQgYXMgPjM1JSBvZiBpbmNvbWUgaXMgc3BlbnQgb24gcmVudCoKCllvdSBjYW4gem9vbSBpbiBvbiB0aGUgbWFwICh1bmRlcmxpZWQgYnkgaW1hZ2VyeSksIGFuZCBjbGlja2luZyBvbiBjb21tdW5pdHkgZGlzdHJpY3RzIHdpbGwgaGlnaGxpZ2h0IHRoZW0gYm90aCBpbiB0aGUgbWFwIGFuZCB0aGUgc2NhdHRlcnBsb3QsIGFuZCBrZWVwIHRoZW0gaW4gdGhlIHRhYmxlIHdoaWxlIGV4Y2x1ZGluZyBvdGhlciByb3dzLiAoVGhlIGNvbW11bml0eSBkaXN0cmljdCAjIHdpbGwgYWxzbyBiZSBkaXNwbGF5ZWQpLiBUbyByZXNldCB0aGUgc2VsZWN0aW9uLCB5b3UgY2FuIGVpdGhlciByZS1jbGljayB0aGUgaW5kaXZpZHVhbCBwb2x5Z29ucywgb3IganVzdCBkb3VibGUgY2xpY2sgaW4gdGhlIHNjYXR0ZXJwbG90LiAgWW91IGNhbiBhbHNvIGRyYXcgYSBib3ggYXJvdW5kIHBvaW50cyBpbiB0aGUgc2NhdHRlcnBsb3QsIHdoaWNoIHdpbGwgaGlnaGxpZ2h0IHRoZW0gaW4gdGhlIG1hcCwgYW5kIGtlZXAgdGhlbSBpbiB0aGUgdGFibGUuIChVbmZvcnR1bmF0ZWx5IGF0IHRoaXMgcG9pbnQsIHRoZSB0YWJsZSBpcyByZWFsbHkganVzdCBmb3Igdmlld2luZyAtIHlvdSBjYW4gb3JkZXIgZGF0YSBieSBjbGlja2luZyBvbiBjb2x1bW4gbmFtZXMsIGJ1dCB5b3UgY2FuJ3Qgc2VsZWN0IGRhdGEgaW4gdGhlIHRhYmxlIGFuZCBoYXZlIGl0IHJlZmxlY3RlZCBpbiB0aGUgc2NhdHRlcnBsb3QvbWFwLikKClRoaXMgaXMgcmVhbGx5IGZvciBleHBsb3JhdG9yeSB2aXN1YWxpemF0aW9ucywgYW5kIHRoZXJlIGFyZSBuYXR1cmFsbHkgYWRkaXRpb25hbCB0aGluZ3MgdGhhdCBjYW4gYmUgYWRkZWQgZm9yIGVhc2Ugb2YgdXNlLiBDb21wYXJlZCB0byBhIHByZXZpb3VzIHZlcnNpb24sIHRoaXMgbGV0cyB5b3Ugc2VsZWN0IHBvbHlnb25zLCBhbmQgYWxzbyB2aWV3IHRoZSBkYXRhIGluIHRoZSB0YWJsZS4gSW4gdGhlIG5lYXIgZnV0dXJlIEknbGwgd29yayB0byBkbyB0aGlzIHdpdGggb3RoZXIgbGF5ZXJzLCBmb3IgZXhhbXBsZSBsb29raW5nIGF0IGNvbWJpbmVkICUgYXJlYSBjYW5vcHkrZ3Jhc3MgYnkgY29tbXVuaXR5IGRpc3RyaWN0LCBhbmQgc29tZSBvdGhlciBzb2Npby1lY29ub21pYyB2YXJpYWJsZXMgZnJvbSB0aGUgQ29tbXVuaXR5IFByb2ZpbGVzLiBJJ2xsIGFsc28gd29yayB0byBhZGQgZnVuY3Rpb25hbGl0eSB0byB0b2dnbGUgbGF5ZXJzIG9uL29mZiwgYW5kIGNoYW5nZSB0aGUgdmFyaWFibGUgbmFtZXMgYXMgZGlzcGxheWVkLiBbcnVubmluZyB0YWxseSBvZiBkZXNpcmVkIGZ1bmN0aW9uYWxpdHkgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS5dCgoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9RkFMU0V9CiMjIEF0IHRpbWUgb2Ygd3JpdGluZyB0aGlzIHJlbGllcyBvbiBkZXYgdmVyc2lvbiBvZiBzZiB0byBhbGxvdyBmb3IgaW1wb3J0IG9mIG5vbi1zcGF0aWFsIHRhYmxlcyBmcm9tIGZnZGIKIyMgcmVsaWVzIG9uIHJ0b29scyAzLjQgYmVpbmcgaW5zdGFsbGVkOyB0YWtlcyBhIGZldyBtaW51dGVzIG9uIHdpbmRvd3MsIGFuZCB3aW5kb3dzIG1pZ2h0IGhhdmUgaXNzdWVzIHcvIGNvbmZsaWN0aW4gUmNwcCB2ZXJzaW9ucwojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyLXNwYXRpYWwvc2YiKQoKIyBUaGUgaW5wdXQgZmlsZSBnZW9kYXRhYmFzZQpmZ2RiIDwtICIuLi9OWUNfMjBVcmJhbl8yMFRyZWVfMjBDYW5vcHlfMjBBc3Nlc3NtZW50XzIwTWV0cmljc18yMDIwMTAuZ2RiIgpnZXR3ZCgpCiMjIElmIG5lZWRlZCwgY2FuIGxpc3QgYWxsIGZlYXR1cmUgY2xhc3NlcyBpbiBhIGZpbGUgZ2VvZGF0YWJhc2UKI3N1YnNldChyZ2RhbDo6b2dyRHJpdmVycygpLCBncmVwbCgiR0RCIiwgbmFtZSkpCiNmY19saXN0IDwtIHJnZGFsOjpvZ3JMaXN0TGF5ZXJzKGZnZGIpCiNwcmludChmY19saXN0KQoKIyMgUmVhZCB0aGUgc3BhdGlhbCBkYXRhCmNkYm5kIDwtIHNmOjpzdF9yZWFkKGRzbj1mZ2RiLGxheWVyPSJOWUNfQ29tbXVuaXR5X0Rpc3RyaWN0c19WZXJzaW9uMTBDIikKCiNyZWFkIHRoZSB0cmVlIGxhbmQgY292ZXIgbWV0cmljcwpjZGRhdGEgPC0gc2Y6OnN0X3JlYWQoZHNuPWZnZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI9IkxhbmRDb3Zlcl9NZXRyaWNzX05ZQ19Db21tdW5pdHlfRGlzdHJpY3RzX1ZlcnNpb24xMEMiKQoKIyMgQWRkIHRoZSB0YWJ1bGFyIGRhdGEgdG8gdGhlIHNwYXRpYWwgb2JqZWN0CmNkLmxjIDwtIG1lcmdlKGNkYm5kLCBjZGRhdGEpCgoKIyMgTG9hZCB1cCB0aGUgY29tbXVuaXR5IGRpc3RyaWN0IHByb2ZpbGUgZGF0YQojY2Rwcm9maWxlcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9wbGFubmluZ2xhYnMuY2FydG8uY29tL2FwaS92Mi9zcWw/Zm9ybWF0PWNzdiZxPVNFTEVDVCUyMGNhcnRvZGJfaWQsdGhlX2dlb20sdGhlX2dlb21fd2VibWVyY2F0b3Isc2hhcmVkX3B1bWEsZnV0dXJlX2ZwX21oaGksY3VycmVudF9mcF9taGhpLGNkX3RvdF9yZXN1bml0cyxmdXR1cmVfZnBfcmVzdW5pdHMsZnV0dXJlX2ZwX2JsZGcsY3VycmVudF9mcF9yZXN1bml0cyxjZF90b3RfYmxkZ3MsY3VycmVudF9mcF9ibGRnLG1vZV91bmRlcjE4X3JhdGVfbnljLG1vZV91bmRlcjE4X3JhdGVfYm9ybyx0b3RhbF9sb3RfYXJlYSxsb3RfYXJlYV9vdGhlcl9ub19kYXRhLGxvdF9hcmVhX3BhcmtpbmcsbG90X2FyZWFfb3Blbl9zcGFjZSxsb3RfYXJlYV9wdWJsaWNfZmFjaWxpdHlfaW5zdGl0dXRpb24sbG90X2FyZWFfdHJhbnNwb3J0YXRpb25fdXRpbGl0eSxsb3RfYXJlYV9pbmR1c3RyaWFsX21hbnVmYWN0dXJpbmcsbG90X2FyZWFfY29tbWVyY2lhbF9vZmZpY2UsbG90X2FyZWFfbWl4ZWRfdXNlLGxvdF9hcmVhX3Jlc19tdWx0aWZhbWlseV9lbGV2YXRvcixsb3RfYXJlYV9yZXNfbXVsdGlmYW1pbHlfd2Fsa3VwLGxvdF9hcmVhX3Jlc18xXzJfZmFtaWx5X2JsZGcsbG90c190b3RhbCxsb3RzX290aGVyX25vX2RhdGEsbG90c192YWNhbnQsbG90c19wYXJraW5nLGxvdHNfb3Blbl9zcGFjZSxsb3RzX3B1YmxpY19mYWNpbGl0eV9pbnN0aXR1dGlvbixsb3RzX3RyYW5zcG9ydGF0aW9uX3V0aWxpdHksbG90c19pbmR1c3RyaWFsX21hbnVmYWN0dXJpbmcsbG90c19jb21tZXJjaWFsX29mZmljZSxsb3RzX21peGVkX3VzZSxsb3RzX3Jlc19tdWx0aWZhbWlseV9lbGV2YXRvcixsb3RzX3Jlc19tdWx0aWZhbWlseV93YWxrdXAsbG90c19yZXNfMV8yX2ZhbWlseV9ibGRnLHBjdF9zZXJ2ZWRfcGFya3MsY291bnRfcHVibGljX3NjaG9vbHMsY291bnRfbGlicmFyaWVzLGNvdW50X2hvc3BfY2xpbmljLGNvdW50X3BhcmtzLGNyaW1lX2NvdW50X255YyxjcmltZV9jb3VudF9ib3JvLGNyaW1lX2NvdW50LHBjdF9jbGVhbl9zdHJ0c19ueWMscG9wXzExXzE1X2Fjcyxwb3BfMjAxMCxwb3BfMjAwMCxwdW1hLGJvcm9jZCxmdXR1cmVfZnBfcG9wLGN1cnJlbnRfZnBfcG9wLGxvdF9hcmVhX3ZhY2FudCxjYl9lbWFpbCxjYl93ZWJzaXRlLGFjc190b29sdGlwLG5laWdoYm9yaG9vZHMsc29uX2lzc3VlXzMsc29uX2lzc3VlXzIsc29uX2lzc3VlXzEsY2Rfc29uX2Z5MjAxOCxzaGFyZWRfcHVtYV9jZCxjZF9zaG9ydF90aXRsZSxjZF9mdWxsX3RpdGxlLGZ1dHVyZV9mcF9jb3N0X2J1cmRlbixjdXJyZW50X2ZwX2Nvc3RfYnVyZGVuLGZ1dHVyZV9mcF9yZW50X2J1cmRlbixjdXJyZW50X2ZwX3JlbnRfYnVyZGVuLGZ1dHVyZV9mcF9wZXJtb3J0ZyxjdXJyZW50X2ZwX3Blcm1vcnRnLGZ1dHVyZV9mcF9vd25lcm9jYyxjdXJyZW50X2ZwX293bmVyb2NjLGZ1dHVyZV9mcF9vcGVuc3BhY2UsY3VycmVudF9mcF9vcGVuc3BhY2UsZnV0dXJlX2ZwX2FyZWEsY3VycmVudF9mcF9hcmVhLHBjdF9oaXNwYW5pYyxwY3Rfb3RoZXJfbmgscGN0X2FzaWFuX25oLHBjdF9ibGFja19uaCxwY3Rfd2hpdGVfbmgsZmVtYWxlXzg1X292ZXIsbWFsZV84NV9vdmVyLGZlbWFsZV84MF84NCxtYWxlXzgwXzg0LGZlbWFsZV83NV83OSxtYWxlXzc1Xzc5LGZlbWFsZV83MF83NCxtYWxlXzcwXzc0LGZlbWFsZV82NV82OSxtYWxlXzY1XzY5LGZlbWFsZV82MF82NCxtYWxlXzYwXzY0LGZlbWFsZV81NV81OSxtYWxlXzU1XzU5LGZlbWFsZV81MF81NCxtYWxlXzUwXzU0LGZlbWFsZV80NV80OSxtYWxlXzQ1XzQ5LGZlbWFsZV80MF80NCxtYWxlXzQwXzQ0LGZlbWFsZV8zNV8zOSxtYWxlXzM1XzM5LGZlbWFsZV8zMF8zNCxtYWxlXzMwXzM0LGZlbWFsZV8yNV8yOSxtYWxlXzI1XzI5LGZlbWFsZV8yMF8yNCxtYWxlXzIwXzI0LGZlbWFsZV8xNV8xOSxtYWxlXzE1XzE5LGZlbWFsZV8xMF8xNCxtYWxlXzEwXzE0LGZlbWFsZV81XzksbWFsZV81XzksZmVtYWxlX3VuZGVyXzUsbWFsZV91bmRlcl81LG1vZV9vdmVyNjVfcmF0ZV9ueWMsb3ZlcjY1X3JhdGVfbnljLG1vZV9vdmVyNjVfcmF0ZV9ib3JvLG92ZXI2NV9yYXRlX2Jvcm8sbW9lX292ZXI2NV9yYXRlLG92ZXI2NV9yYXRlLHVuZGVyMThfcmF0ZV9ueWMsdW5kZXIxOF9yYXRlX2Jvcm8sbW9lX3VuZGVyMThfcmF0ZSx1bmRlcjE4X3JhdGUsbW9lX2xlcF9yYXRlX255YyxsZXBfcmF0ZV9ueWMsbW9lX2xlcF9yYXRlX2Jvcm8sbGVwX3JhdGVfYm9ybyxtb2VfbGVwX3JhdGUsbGVwX3JhdGUsbW9lX2ZvcmVpZ25fYm9ybixwY3RfZm9yZWlnbl9ib3JuLHBjdF9sb3RfYXJlYV9vdGhlcl9ub19kYXRhLHBjdF9sb3RfYXJlYV92YWNhbnQscGN0X2xvdF9hcmVhX3BhcmtpbmcscGN0X2xvdF9hcmVhX29wZW5fc3BhY2UscGN0X2xvdF9hcmVhX3B1YmxpY19mYWNpbGl0eV9pbnN0aXR1dGlvbixwY3RfbG90X2FyZWFfdHJhbnNwb3J0YXRpb25fdXRpbGl0eSxwY3RfbG90X2FyZWFfaW5kdXN0cmlhbF9tYW51ZmFjdHVyaW5nLHBjdF9sb3RfYXJlYV9jb21tZXJjaWFsX29mZmljZSxwY3RfbG90X2FyZWFfbWl4ZWRfdXNlLHBjdF9sb3RfYXJlYV9yZXNfbXVsdGlmYW1pbHlfZWxldmF0b3IscGN0X2xvdF9hcmVhX3Jlc19tdWx0aWZhbWlseV93YWxrdXAscGN0X2xvdF9hcmVhX3Jlc18xXzJfZmFtaWx5X2JsZGcsY3JpbWVfcGVyXzEwMDBfbnljLGNyaW1lX3Blcl8xMDAwX2Jvcm8sY3JpbWVfcGVyXzEwMDAscGN0X2NsZWFuX3N0cnRzX2Jvcm8scGN0X2NsZWFuX3N0cnRzLG1vZV9oaF9yZW50X2J1cmRfbnljLHBjdF9oaF9yZW50X2J1cmRfbnljLG1vZV9oaF9yZW50X2J1cmRfYm9ybyxwY3RfaGhfcmVudF9idXJkX2Jvcm8sbW9lX2hoX3JlbnRfYnVyZCxwY3RfaGhfcmVudF9idXJkLG1vZV9tZWFuX2NvbW11dGVfbnljLG1lYW5fY29tbXV0ZV9ueWMsbW9lX21lYW5fY29tbXV0ZV9ib3JvLG1lYW5fY29tbXV0ZV9ib3JvLG1vZV9tZWFuX2NvbW11dGUsbWVhbl9jb21tdXRlLG1vZV91bmVtbnBsb3ltZW50LHVuZW1wbG95bWVudF9ueWMsbW9lX3VuZW1wbG95bWVudF9ib3JvLHVuZW1wbG95bWVudF9ib3JvLG1vZV91bmVtcGxveW1lbnRfY2QsdW5lbXBsb3ltZW50X2NkLG1vZV9iYWNoX2RlZ19ueWMscGN0X2JhY2hfZGVnX255Yyxtb2VfYmFjaF9kZWdfYm9ybyxwY3RfYmFjaF9kZWdfYm9ybyxtb2VfYmFjaF9kZWcscGN0X2JhY2hfZGVnLHBvdmVydHlfcmF0ZV9ueWMscG92ZXJ0eV9yYXRlX2Jvcm8sbW9lX3BvdmVydHlfcmF0ZSxwb3ZlcnR5X3JhdGUscG9wX2NoYW5nZV8wMF8xMCxhcmVhX3NxbWksYWNyZXMlMjBGUk9NJTIwY29tbXVuaXR5X2Rpc3RyaWN0X3Byb2ZpbGVzJmZpbGVuYW1lPVF1ZWVucy03LWluZGljYXRvcnMuY3N2IikKCgpjZHByb2ZpbGVzIDwtIHJlYWQuY3N2KCJodHRwczovL3BsYW5uaW5nbGFicy5jYXJ0by5jb20vYXBpL3YyL3NxbD9mb3JtYXQ9Y3N2JnE9U0VMRUNUJTIwY2FydG9kYl9pZCxib3JvY2QscGN0X2hoX3JlbnRfYnVyZCUyMEZST00lMjBjb21tdW5pdHlfZGlzdHJpY3RfcHJvZmlsZXMiKQojIyBGb3Igc29tZSBlYXNpZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSwgZGF0YSBkaWN0aW9uYXJ5OgpjZHByb2ZpbGUuZGF0YWRpYyA8LSByZWFkLmNzdigiaHR0cHM6Ly9jb21tdW5pdHlwcm9maWxlcy5wbGFubmluZy5ueWMuZ292L2RhdGEvY2RfcHJvZmlsZV9kYXRhX2RpY3Rpb25hcnkuY3N2IikKCiMjIE1lcmdlIHdpdGggbGFuZCBjb3ZlciBkYXRhCmNkLmxjLmNwIDwtIG1lcmdlKGNkLmxjLCBjZHByb2ZpbGVzLCBieS54PSJCb3JvQ0QiLCBieS55PSJib3JvY2QiKQoKY2QubGMuY3AkQ2FuX1AgPC0gcm91bmQoY2QubGMuY3AkQ2FuX1AsIDApCmNkLmxjLmNwJHBjdF9oaF9yZW50X2J1cmQgPC0gcm91bmQoY2QubGMuY3AkcGN0X2hoX3JlbnRfYnVyZCwgMCkKCgojaW5zdGFsbC5wYWNrYWdlcyhjKCJwbG90bHkiLCAiRFQiKSkKY2QubGMuY3AyIDwtIGNkLmxjLmNwWyxjKCJCb3JvQ0QiLCAiQ2FuX1AiLCAicGN0X2hoX3JlbnRfYnVyZCIpXQpvYmplY3Quc2l6ZShjZC5sYy5jcDIpCgpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGNyb3NzdGFsaykKbGlicmFyeShodG1sdG9vbHMpCgpjZC5sYy5jcDIgPC0gc3RfdHJhbnNmb3JtKGNkLmxjLmNwMiwgY3JzPTQzMjYpCiAgCmNkX3NkIDwtIFNoYXJlZERhdGEkbmV3KAogIGNkLmxjLmNwMiwKICBrZXk9fkJvcm9DRCwKICAjIHByb3ZpZGUgZXhwbGljaXQgZ3JvdXAgc28gd2UgY2FuIGVhc2lseSByZWZlciB0byB0aGlzIGxhdGVyCiAgZ3JvdXAgPSAiQm9yb0NEIgopCgoKCm1hcCA8LSBsZWFmbGV0KGNkX3NkKSAlPiUKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLlBvc2l0cm9uKSAlPiUKICBhZGRUaWxlcyh1cmxUZW1wbGF0ZSA9ICJodHRwczovL21hcHMubnljLmdvdi90bXMvMS4wLjAvcGhvdG8vMjAxNi97en0ve3h9L3t5fS5wbmc4IiwKICAgICAgICAgICBhdHRyaWJ1dGlvbiA9ICdJbWFnZXJ5IGZyb20gdGhlIDxhIGhyZWY9Imh0dHBzOi8vbWFwcy5ueWMuZ292L3RpbGVzLyI+Q2l0eSBvZiBOZXcgWW9yazwvYT4nLAogICAgICAgICAgIG9wdGlvbnMgPSB0aWxlT3B0aW9ucyhtaW5OYXRpdmVab29tPSA4LCBtYXhOYXRpdmVab29tPSAxOSwgc3ViZG9tYWlucz0gJzEyMzQnLCB0bXM9VFJVRSkpICU+JSAgICAjYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5Qb3NpdHJvbikgJT4lCiAgYWRkUG9seWdvbnMoCiAgICBkYXRhPWNkLmxjLmNwMiwKICAgIGxheWVySWQgPSB+Qm9yb0NELAogICAgY29sb3IgPSAiIzQ0NDQ0NCIsCiAgICB3ZWlnaHQgPSAxLAogICAgc21vb3RoRmFjdG9yID0gMC41LAogICAgb3BhY2l0eSA9IDEuMCwKICAgIGZpbGxPcGFjaXR5ID0gMC41LAogICAgZmlsbENvbG9yID0gfmNvbG9yUXVhbnRpbGUoIkdyZWVucyIsIENhbl9QKShDYW5fUCksCiAgICBwb3B1cD1+YXMuY2hhcmFjdGVyKHBhc3RlKCJDb21tdW5pdHkgRGlzdHJpY3QiLCBCb3JvQ0QpKSwjLAojICB0dXJuIG9mZiBoaWdobGlnaHQgc2luY2UgaXQgaW50ZXJmZXJlcyB3aXRoIHNlbGVjdGlvbiBzdHlsaW5nCiMgICBpZiBjYXJlZnVsIHdpdGggc3R5bGluZyBjb3VsZCBoYXZlIGJvdGggaGlnaGxpZ2h0IGFuZCBzZWxlY3QKIyAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9IDIpCiAgKQoKIyBib3Jyb3cgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vci1zcGF0aWFsL21hcGVkaXQvYmxvYi9tYXN0ZXIvUi9xdWVyeS5SI0w3My1MMTMyCiMgICB0byBzZWxlY3QvZGVzZWxlY3QgZmVhdHVyZXMgYnV0IGluc3RlYWQgb2YgU2hpbnkub25JbnB1dENoYW5nZQojICAgdXNlIGNyb3NzdGFsayB0byBtYW5hZ2Ugc3RhdGUKYWRkX3NlbGVjdF9zY3JpcHQgPC0gZnVuY3Rpb24obGYsIHN0eWxlRmFsc2UsIHN0eWxlVHJ1ZSwgbnM9IiIpIHsKICAjIyBjaGVjayBmb3IgZXhpc3Rpbmcgb25SZW5kZXIganNIb29rPwoKICBodG1sd2lkZ2V0czo6b25SZW5kZXIoCiAgICBsZiwKICAgIHNwcmludGYoCiIKZnVuY3Rpb24oZWwseCkgewogIHZhciBsZiA9IHRoaXM7CiAgdmFyIHN0eWxlX29iaiA9IHsKICAgICdmYWxzZSc6ICVzLAogICAgJ3RydWUnOiAlcwogIH0KCiAgLy8gaW5zdGVhZCBvZiBzaGlueSBpbnB1dCBhcyBvdXIgc3RhdGUgbWFuYWdlcgogIC8vICAgdXNlIGNyb3NzdGFsawogIGlmKGNyb3NzdGFsaykgewogICAgdmFyIGN0X3NlbCA9IG5ldyBjcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKCkKICAgIGN0X3NlbC5zZXRHcm91cCgnQm9yb0NEJykKICAgIGN0X3NlbC5vbignY2hhbmdlJywgZnVuY3Rpb24oeCl7CiAgICAgIGlmKHguc2VuZGVyICE9PSBjdF9zZWwpIHsgLy9pZ25vcmUgc2VsZWN0IGZyb20gdGhpcyBtYXAKICAgICAgICBsZi5lYWNoTGF5ZXIoZnVuY3Rpb24obHlyKXsKICAgICAgICAgIGlmKGx5ci5vcHRpb25zICYmIGx5ci5vcHRpb25zLmxheWVySWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gU3RyaW5nKGx5ci5vcHRpb25zLmxheWVySWQpCiAgICAgICAgICAgIGlmKAogICAgICAgICAgICAgICF4LnZhbHVlICB8fAogICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHgudmFsdWUpICYmIHgudmFsdWUuaW5kZXhPZihpZCkgPT09IC0xKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICB0b2dnbGVfc3RhdGUobHlyLCBmYWxzZSkKICAgICAgICAgICAgICB0b2dnbGVfc3R5bGUobHlyLCBzdHlsZV9vYmouZmFsc2UpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh4LnZhbHVlKSAmJiB4LnZhbHVlLmluZGV4T2YoaWQpID4gLTEpIHsKICAgICAgICAgICAgICB0b2dnbGVfc3RhdGUobHlyLCB0cnVlKQogICAgICAgICAgICAgIHRvZ2dsZV9zdHlsZShseXIsIHN0eWxlX29iai50cnVlKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgfSkKICB9CgogIC8vIGRlZmluZSBvdXIgZnVuY3Rpb25zIGZvciB0b2dnbGluZwogIGZ1bmN0aW9uIHRvZ2dsZV9zdHlsZShsYXllciwgc3R5bGVfb2JqKSB7CiAgICBsYXllci5zZXRTdHlsZShzdHlsZV9vYmopOwogIH07CiAgZnVuY3Rpb24gdG9nZ2xlX3N0YXRlKGxheWVyLCBzZWxlY3RlZCwgaW5pdCkgewogICAgaWYodHlwZW9mKHNlbGVjdGVkKSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgbGF5ZXIuX21hcGVkaXRfc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgIH0gZWxzZSB7CiAgICAgIHNlbGVjdGVkID0gIWxheWVyLl9tYXBlZGl0X3NlbGVjdGVkOwogICAgICBsYXllci5fbWFwZWRpdF9zZWxlY3RlZCA9IHNlbGVjdGVkOwogICAgfQogICAgaWYodHlwZW9mKFNoaW55KSAhPT0gJ3VuZGVmaW5lZCcgJiYgU2hpbnkub25JbnB1dENoYW5nZSAmJiAhaW5pdCkgewogICAgICBTaGlueS5vbklucHV0Q2hhbmdlKAogICAgICAgICclcy1tYXBlZGl0X3NlbGVjdGVkJywKICAgICAgICB7CiAgICAgICAgICAnZ3JvdXAnOiBsYXllci5vcHRpb25zLmdyb3VwLAogICAgICAgICAgJ2lkJzogbGF5ZXIub3B0aW9ucy5sYXllcklkLAogICAgICAgICAgJ3NlbGVjdGVkJzogc2VsZWN0ZWQKICAgICAgICB9CiAgICAgICkKICAgIH0KCiAgICBpZihjdF9zZWwpIHsKICAgICAgdmFyIGN0X3ZhbHVlcyA9IGN0X3NlbC52YWx1ZQogICAgICB2YXIgaWQgPSBTdHJpbmcobGF5ZXIub3B0aW9ucy5sYXllcklkKQogICAgICBpZihzZWxlY3RlZCkgewogICAgICAgIGlmKCFjdF92YWx1ZXMpIHsKICAgICAgICAgIGN0X3NlbC5zZXQoW2lkXSkKICAgICAgICB9CiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjdF92YWx1ZXMpICYmIGN0X3ZhbHVlcy5pbmRleE9mKGlkKSA9PT0gLTEpIHsKICAgICAgICAgIGN0X3NlbC5zZXQoY3RfdmFsdWVzLmNvbmNhdChpZCkpCiAgICAgICAgfQogICAgICB9CgogICAgICBpZihjdF92YWx1ZXMgJiYgIXNlbGVjdGVkKSB7CiAgICAgICAgY3RfdmFsdWVzLmxlbmd0aCA+IDEgPwogICAgICAgICAgY3Rfc2VsLnNldCgKICAgICAgICAgICAgY3RfdmFsdWVzLmZpbHRlcihmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGQgIT09IGlkCiAgICAgICAgICAgIH0pCiAgICAgICAgICApIDoKICAgICAgICAgIGN0X3NlbC5zZXQobnVsbCkgLy8gc2VsZWN0IGFsbCBpZiBub3RoaW5nIHNlbGVjdGVkCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc2VsZWN0ZWQ7CiAgfTsKICAvLyBzZXQgdXAgY2xpY2sgaGFuZGxlciBvbiBlYWNoIGxheWVyIHdpdGggYSBncm91cCBuYW1lCiAgbGYuZWFjaExheWVyKGZ1bmN0aW9uKGx5cil7CiAgICBpZihseXIub24gJiYgbHlyLm9wdGlvbnMgJiYgbHlyLm9wdGlvbnMubGF5ZXJJZCkgewogICAgICAvLyBzdGFydCB3aXRoIGFsbCB1bnNlbGVjdGVkID8KICAgICAgdG9nZ2xlX3N0YXRlKGx5ciwgZmFsc2UsIGluaXQ9dHJ1ZSk7CiAgICAgIHRvZ2dsZV9zdHlsZShseXIsIHN0eWxlX29ialtseXIuX21hcGVkaXRfc2VsZWN0ZWRdKTsKICAgICAgbHlyLm9uKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gdG9nZ2xlX3N0YXRlKGUudGFyZ2V0KTsKICAgICAgICB0b2dnbGVfc3R5bGUoZS50YXJnZXQsIHN0eWxlX29ialtTdHJpbmcoc2VsZWN0ZWQpXSk7CiAgICAgIH0pOwogICAgfQogIH0pOwp9CiIsCiAgICAgIGpzb25saXRlOjp0b0pTT04oc3R5bGVGYWxzZSwgYXV0b191bmJveD1UUlVFKSwKICAgICAganNvbmxpdGU6OnRvSlNPTihzdHlsZVRydWUsIGF1dG9fdW5ib3g9VFJVRSksCiAgICAgIG5zCiAgICApCiAgKQp9CgoKbGlicmFyeShEVCkKZHQgPC0gZGF0YXRhYmxlKGNkX3NkLCB3aWR0aD0iMTAwJSIpCmR0JHgkZGF0YSA8LSBkcGx5cjo6c2VsZWN0KGR0JHgkZGF0YSwgLWdlb21ldHJ5KQojZHQkeCRkYXRhIDwtIGRwbHlyOjpzZWxlY3QoZHQkeCRkYXRhLCBCb3JvQ0QsIENhbl9QLCBwY3RfaGhfcmVudF9idXJkKQpkdCR4JG9wdGlvbnMkY29sdW1uRGVmc1tbMV1dJHRhcmdldHMgPC0gc2VxX2xlbihuY29sKGNkLmxjLmNwMiktMSkKI2R0JHgkb3B0aW9ucyRjb2x1bW5EZWZzW1sxXV0kdGFyZ2V0cyA8LSAod2hpY2gobmFtZXMoZHQkeCRkYXRhPT1jKCJCb3JvQ0QiLCAiQ2FuX1AiLCAicGN0X2hoX3JlbnRfYnVyZCIpKSkpCiNzZXFfbGVuKG5jb2woZHQkeCRkYXRhKSkKCgojKGR0JHgkb3B0aW9ucyRjb2x1bW5EZWZzW1sxXV0kdGFyZ2V0cyk9PSJCb3JvQ0QiCgphdHRyKGR0JHgsICJjb2xuYW1lcyIpIDwtIGF0dHIoZHQkeCwgImNvbG5hbWVzIikjW3doaWNoKGF0dHIoZHQkeCwgImNvbG5hbWVzIikgIT0gImdlb21ldHJ5IildCmR0JHgkY29udGFpbmVyIDwtIGdzdWIoeD1kdCR4JGNvbnRhaW5lciwgcGF0dGVybj0iPHRoPmdlb21ldHJ5PC90aD5cbiIsIHJlcGxhY2VtZW50PSIiKQojZHQKCiMgbm93IHRyeSBsZWFmbGV0LCBwbG90bHksIGFuZCBkdAojICAgdGhpcyB1bmZvcnR1bmF0ZWx5IGRvZXMgbm90IHdvcmsKIyAgIGV4YWN0bHkgYXMgd2Ugd291bGQgbGlrZSBidXQgcGxvdGx5IHVzZSBvZiBTdHJpbmcga2V5CiMgICBzZWVtcyB0byBjYXVzZSB0aGUgcHJvYmxlbQojICAgZml4aW5nIFBsb3RseSBpcyBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBwcm9qZWN0CiMgICBidXQgSSBtaWdodCB0YWtlIGEgbG9vayBhdCBzb21lIHBvaW50IHRvIHN1Ym1pdCBwdWxsCmJyb3dzYWJsZSgKICB0YWdMaXN0KAogICAgdGFncyRkaXYoCiAgICAgIHN0eWxlID0gImZsb2F0OmxlZnQ7IHdpZHRoOiA0OSU7IiwKICAgICAgYWRkX3NlbGVjdF9zY3JpcHQoCiAgICAgICAgbWFwLAogICAgICAgIHN0eWxlRmFsc2UgPSBsaXN0KGZpbGxPcGFjaXR5ID0gMC42LCB3ZWlnaHQgPSAxLCBvcGFjaXR5ID0gMC40LCBjb2xvcj0iYmxhY2siKSwKICAgICAgICBzdHlsZVRydWUgPSBsaXN0KGZpbGxPcGFjaXR5ID0gMC43LCB3ZWlnaHQgPSAzLCBvcGFjaXR5ID0gMC43LCBjb2xvcj0iYmx1ZSIpLAogICAgICAgIG5zID0gIiIKICAgICAgKQogICAgKSwKICAgIHRhZ3MkZGl2KAogICAgICBzdHlsZSA9ICJmbG9hdDpsZWZ0OyB3aWR0aDogNDklOyIsCiAgICAgIHBsb3RfbHkoY2Rfc2QsIHggPSB+Q2FuX1AsIHkgPSB+cGN0X2hoX3JlbnRfYnVyZCkgJT4lCiAgICAgICAgYWRkX21hcmtlcnMoYWxwaGEgPSAwLjUsdGV4dCA9IH5wYXN0ZSgnQ29tbXVuaXR5IERpc3RyaWN0OiAnLCBCb3JvQ0QpKSAlPiUKICAgICAgICBoaWdobGlnaHQob24gPSAicGxvdGx5X3NlbGVjdGVkIikKICAgICksCiAgICB0YWdzJGRpdigKICAgICAgc3R5bGUgPSAiZmxvYXQ6bGVmdDsgd2lkdGg6IDk4JTsiLAogICAgICBkdAogICAgKQogICkKKQoKYGBgCjxiciAvPiAKPGJyIC8+CgoKCkRlc2lyZWQgRnVuY3Rpb25hbGl0eToKCiogQWRkIGJhY2sgdG9nZ2xpbmcgb2YgYmFzZW1hcHM7CiogQWRkIG90aGVyIGxheWVycyB0byBtYXAgKGUuZy4sIHRvdGFsIGFyZWEgb2YgZXN0aW1hdGVkIHBlcm1lYWJsZSBvciB0cmVlIGNhbm9weTsgb3RoZXIgc29jaW8tZWNvbWljL2hlYWx0aCB2YXJpYWJsZXMpOwoqIENoYW5nZSB2YXJpYWJsZSBuYW1lcyBpbiBkaXNwbGF5IChlLmcuLCAlIG9mIEhvdXNlaG9sZHMgdGhhdCBhcmUgUmVudCBCdXJkZW5lZCk7CiogQWRkIGFub3RoZXIgdmFyaWFibGUgb3IgdHdvIGFuZCBtYWtlIGl0IHNvIHlvdSBjYW4gdG9nZ2xlIGJldHdlZW4gdGhlbTsKKiBNYWtlIGl0IHNvIHlvdSBjYW4gc2VsZWN0IGluIHRoZSAgdGFibGUgYW5kIGhhdmUgdGhhdCByZWZsZWN0ZWQgaW4gdGhlIG1hcCBhbmQgc2NhdHRlcnBsb3Q7CiogSGlzdG9ncmFtcyB0aGF0IGhpZ2hsaWdodA==